package com.haiyou.dc.thread.test3;

/**
 * 单例模式DCL,在饿汉式基础上，对外环境只有一个实例
 * 1、构造函数私有化，防止new对象
 * 2、私有静态成员实例
 * 3、提供公共的静态方法
 */
public class TestDCL {

    private volatile static TestDCL instance;

    private TestDCL() {

    }

    public static TestDCL getInstance() {

        //double check，避免不必要的同步，存在的对象不判断
        if (instance != null) {
            return instance;
        }

        synchronized (TestDCL.class) {
            if (instance == null) {
                //新建对象步骤：1开辟空间、2对象初始化信息，3返回对象的地址给引用
                //这里可能出现指令重排问题，在第二步可能很耗时，虚拟机将直接返回第三步空对象
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                instance = new TestDCL();
            }
        }

        return instance;
    }

    public static TestDCL getInstance2() {


        if (instance == null) {
            //1开辟空间、2对象初始化信息，3返回对象
            //这里可能出现指令重排问题，在第二步可能很耗时，虚拟机将直接返回第三步空对象
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            instance = new TestDCL();
        }

        return instance;
    }


    public static void main(String[] args) {
        new Thread(() -> {
            System.out.println(TestDCL.getInstance());
        }).start();

        System.out.println(TestDCL.getInstance());
    }


}
